home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
pao
/
tsr
/
src
/
aclamp.asm
next >
Wrap
Assembly Source File
|
1994-06-01
|
34KB
|
1,042 lines
;============================================================================
; << MASM V5.1 >> for FM TOWNS
;============================================================================
.186
PAGE 60,132
NAME ACLAMP
TITLE Access Lamp
;============================================================================
; Access Lamp program (FMシリーズ)
;
; ディスクアクセスの状態表示をする.
;
; All Rights Reserved, Copyright (C) Y.Hirata 1990-1993.
; Programmed by Y.Hirata ( NIFTY-ID : NAB03321 )
;
; Spetial Thanks : PATCH MAN ( NIFTY-ID : NAC01123 )
;
; < NOTE >
; ● アセンブル方法 ●
; 中解像度: masm aclamp,aclamp50;
; 高解像度: masm /DHIGH_RESO aclamp,aclamp70;
;============================================================================
code SEGMENT
ASSUME cs:code,ds:code,es:code,ss:code
;----------------------------------------------------------------------------
ORG 000h
SEGTOP LABEL BYTE
;----------------------------------------------------------------------------
ORG 02Ch
ENVADRS LABEL WORD
;----------------------------------------------------------------------------
ORG 080h
ARGUMENT LABEL BYTE
;----------------------------------------------------------------------------
ORG 100h
entry: jmp main
;----------------------------------------------------------------------------
%HIGH_RESO LABEL BYTE ; 機種別アセンブル用
;
CR EQU 0Dh ;
LF EQU 0Ah ;
BEL EQU 07h ;
TAB EQU 09h ;
EOF EQU 1Ah ;
;
COPYRIGHT DB CR
DB 01Bh,'[2K',CR,LF,BEL
DB CR,LF,TAB
DB 'Access Lamp Version 1.01 1993.03.02'
DB CR,LF,TAB
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
DB '( Middle Resolution Display Type )',CR,LF
ELSE ; ● 高解像度 ●
DB '( High Resolution Display Type )',CR,LF
ENDIF ;
;///////////////////////////////////////////;
DB CR,LF,TAB
DB 'Copyright (C) Y.Hirata 1990-1993.',CR,LF
DB CR,LF,EOF
;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
TITLE_name DB 'Access Lamp R50系' ; 常駐チェック用文字列
ELSE ; ● 高解像度 ●
TITLE_name DB 'Access Lamp R70系' ; 常駐チェック用文字列
ENDIF ;
;///////////////////////////////////////////;
TITLE_len EQU $-TITLE_name ;
;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
TVRAM EQU 0C800h ; テキストVRAMセグメント
KANJI EQU 0CA00h ; 漢字VRAMセグメント
ELSE ; ● 高解像度 ●
TVRAM EQU 0F800h ; テキストVRAMセグメント
AVRAM EQU 0FA00h ; アトリビュートセグメント
ENDIF ;
;///////////////////////////////////////////;
;
INT_TIME EQU 97h ; タイマ管理BIOS
INT_MODE EQU 0 ; 割り込みモード : インターバルモード
INT_INF EQU 0 ; 割り込みモード使用
;
DEV_CD EQU 0C0h ; デバイス : CD
DEV_FD EQU 020h ; : FD
DEV_HD EQU 0B0h ; : HD
DEV_ICM EQU 050h ; : ICメモリカード
DEV_RAM EQU 040h ; : RAM
DEV_SRAM EQU 041h ; : SRAM
DEV_ROM EQU 042h ; : ROM
DEV_BRAM EQU 043h ; : バックアップRAM
;
;****************************************************************************
; データ領域
;****************************************************************************
vct93h DD FAR ; DISK-BIOS
int93flg DB 0 ; DISK-BIOS処理フラグ
itimflg DB 0 ; 多重割り込み防止用
;
timecnt DW 0 ; インターバルタイマのカウンタ
parablock DB INT_MODE ;
DB 0 ;
DW OFFSET itimhandr ; ハンドラ・オフセット
DW ? ; ハンドラ・セグメント
DW 0 ;
DW 1 ; 10ms のインターバル設定
itimerno DB ? ; タイマ管理番号
dispflg DB 0 ; 書き換え用(表示中フラグ)
;
paraoff LABEL BYTE ;
dispx DW 68 ; 表示位置(桁) 0~
dispy DW 24 ; 表示位置(行) 0~
funcflg DB 0 ; R/W以外のファンクション表示フラグ
revflg DW 0800h ; 反転表示
eracetime DW 50 ; 表示消去時間(10ms単位)
parasize EQU $-paraoff ; パラメタ領域サイズ
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
rcol DW 2400h ; 反転?/強調/GREEN
wcol DW 2200h ; 反転?/強調/RED
xcol DW 0700h ; 反転?/WHITE
ecol DW 0100h ; BLUE
ELSE ; ● 高解像度 ●
rcol DW 000Ch ; 反転?/強調/GREEN
wcol DW 000Ah ; 反転?/強調/RED
xcol DW 0007h ; 反転?/WHITE
ecol DW 0001h ; BLUE
ENDIF ;
;///////////////////////////////////////////;
;
dispcol DW ? ; 表示属性
dispmsgp DW ? ; 表示メッセージ
;
rax DW 0 ; AX
;
CDmsg DB 'CD',0 ; CD
FDmsg DB 'FD',0 ; FD
HDmsg DB 'HD',0 ; HD
ICMmsg DB 'IC',0 ; ICメモリカード
;-------------------------------------------; メモリディスク
RAMmsg DB 'RA',0 ; RAM
SRAMmsg DB 'SR',0 ; SRAM
ROMmsg DB 'RO',0 ; ROM
BRAMmsg DB 'BR',0 ; バックアップRAM
;
sixteen DB 16 ;
XXmsg DB 'XX',0 ; ??
XXlen EQU $-XXmsg-1 ;
;
Memdisktbl DB DEV_RAM ; メモリディスクチェックテーブル
DW OFFSET RAMmsg ;
DB DEV_SRAM ;
DW OFFSET SRAMmsg ;
DB DEV_ROM ;
DW OFFSET ROMmsg ;
DB DEV_BRAM ;
DW OFFSET BRAMmsg ;
Memdiskend LABEL BYTE ;
;
Disktbl DB DEV_CD ; ディスクチェックテーブル(ユニット=0)
DW OFFSET CDmsg ;
DB DEV_FD ;
DW OFFSET FDmsg ;
DB DEV_HD ;
DW OFFSET HDmsg ;
DB DEV_ICM ;
DW OFFSET ICMmsg ;
Disktblend LABEL BYTE ;
;
;****************************************************************************
; MACRO
;****************************************************************************
TSREND MACRO ; プログラム常駐終了(31H)
local close ;
mov cx,5 ; デフォルトオープンファイルのクローズ
close: ;
mov bx,cx ;
dec bx ; ( 0 ~ 4 )
mov ah,3Eh ; ファイルクローズ
int 21h ;
loop close ;
;
mov si,OFFSET ENVADRS ; 環境変数領域を開放
mov ax,cs:[si] ;
mov es,ax ;
mov ah,49h ;
int 21h ;
;
mov dx,OFFSET SEGEND ;
add dx,15 ;
shr dx,4 ; パラグラフ単位
mov ax,3100h ;
int 21h ; 常駐終了
ENDM ;
;----------------------------------------------------------------------------
PRGEND MACRO ; プログラム終了(4CH)
mov ax,4C00h ;
int 21h ; Program End !
ENDM ;
;----------------------------------------------------------------------------
INT93H MACRO ; DISK-BIOS call
pushf ;
call cs:[vct93h] ;
ENDM ;
;----------------------------------------------------------------------------
CONVERT MACRO val,base,dest ; 数字(0~15)->文字
local table,start ;
jmp short start ;
table DB "0123456789ABCDEF" ;
start: ;
push ax ;
push bx ;
push dx ;
mov al,val ;
xor ah,ah ; AH=0
xor bx,bx ; BX=0
div base ; AX/base->AL(商),AH(剰余)
mov bl,al ;
mov al,cs:table[bx] ;
mov dest,al ;
mov bl,ah ;
mov al,cs:table[bx] ;
mov dest[1],al ;
pop dx ;
pop bx ;
pop ax ;
ENDM ;
;
;****************************************************************************
; 常駐処理部
;****************************************************************************
;----------------------------------------------------------------------------
; テキストVRAM(ANK文字列)描画
; < IN > : スタック(8バイト使用)
; < OUT > : 文字コード+文字属性
;----------------------------------------------------------------------------
TVputs PROC NEAR ;
push bp ;
mov bp,sp ; スタックフレーム形成
push ax ; 使用レジスタ退避
push dx ;
push bx ;
push si ;
push es ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 引数
; [bp+4] x (0~) ; WORD: 桁
; [bp+6] y (0~) ; WORD: 行
; [bp+8] *str ; WORD: 文字列アドレス
; [bp+10] attr ; WORD: 表示属性
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov bx,WORD PTR [bp+4] ; x
shl bx,1 ;
;; mov ax,160 ;
;; imul WORD PTR [bp+6] ; y
mov ax,WORD PTR [bp+6] ; y
shl ax,7 ; y*128
add bx,ax ;
mov ax,WORD PTR [bp+6] ; y
shl ax,5 ; y*32
add bx,ax ; 2*x+160*y = offset
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
mov ax,TVRAM ;
mov es,ax ; text vram segment
mov si,WORD PTR [bp+8] ; str
mov ax,WORD PTR [bp+10] ; attr(AHのみ使用)
TVputslp: ;
mov al,BYTE PTR [si] ;
or al,al ; 文字列終端 ?
jz short TVputsend ; YES->TVputsend
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WORD ACCESS ;
; mov WORD PTR es:[bx],ax ; text vram
; inc bx ;
; inc bx ; offset update
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; BYTE ACCESS ; 16β互換はWORD ACCESS不可
mov BYTE PTR es:[bx],al ; code->text vram
inc bx ;
mov BYTE PTR es:[bx],ah ; attr->text vram
inc bx ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ELSE ; ● 高解像度 ●
mov ax,TVRAM ;
mov es,ax ; code segment
mov si,WORD PTR [bp+8] ; str
mov dx,WORD PTR [bp+10] ; attr
TVputslp: ;
mov al,BYTE PTR [si] ;
or al,al ; 文字列終端 ?
jz short TVputsend ; YES->TVputsend
;
sub ah,ah ;
mov WORD PTR es:[bx],ax ; code->text vram
push es ;
mov ax,AVRAM ; attribute segment
mov es,ax ;
mov WORD PTR es:[bx],dx ; attr->text vram
pop es ;
inc bx ;
inc bx ; offset update
ENDIF ;
;///////////////////////////////////////////;
inc si ;
jmp short TVputslp ;
TVputsend: ;
pop es ; 使用レジスタ復元
pop si ;
pop bx ;
pop dx ;
pop ax ;
mov sp,bp ; スタックフレーム開放
pop bp ;
ret ;
TVputs ENDP ;
;----------------------------------------------------------------------------
; int93hファンクション状態表示(ds=csでcall)
; < IN > : dx 表示文字列先頭アドレス
;
; < USE > : ax
;----------------------------------------------------------------------------
int93mon: ;
mov ax,dispcol ; 表示属性
or ax,WORD PTR revflg ;
push ax ;
mov dispmsgp,dx ; 文字列アドレス
push dx ; str
mov ax,dispy ; 表示位置(行) 0~
push ax ; y
mov ax,dispx ; 表示位置(桁) 0~
push ax ; x
call TVputs ; ファンクション状態表示
add sp,8 ;
mov BYTE PTR dispflg,1 ; 表示中フラグセット
mov WORD PTR timecnt,0 ; カウンタクリア
ret ;
;----------------------------------------------------------------------------
; int93hファンクション状態消去(ds=csでcall)
; < IN > : dx 表示文字列先頭アドレス
;
; < USE > : ax
;----------------------------------------------------------------------------
int93erace: ;
mov ax,ecol ; 表示属性
push ax ;
mov dx,dispmsgp ; 文字列アドレス
push dx ; str
mov ax,dispy ; 表示位置(行) 0~
push ax ; y
mov ax,dispx ; 表示位置(桁) 0~
push ax ; x
call TVputs ; ファンクション状態表示
add sp,8 ;
mov BYTE PTR dispflg,0 ; 表示中フラグクリア
mov WORD PTR timecnt,0 ; カウンタクリア
ret ;
;----------------------------------------------------------------------------
; int93hファンクション状態表示色設定(ds=csでcall)
; < RET > : キャリー onならば該当色なし
;
; < USE > : ax
;----------------------------------------------------------------------------
setcolor: ;
mov ax,rax ; DISK-BIOS呼出時のAX
cmp ah,05h ; read ?
jne short setcol_wchk ; NO->次のチェック
mov ax,rcol ;
mov dispcol,ax ;
jmp short setcol_dev ;
setcol_wchk: ;
cmp ah,06h ; write ?
jne short setcol_echk ; NO->その他へ
mov ax,wcol ;
mov dispcol,ax ;
jmp short setcol_dev ;
setcol_echk: ;
cmp BYTE PTR funcflg,1 ; R/W以外のファンクション表示 ?
je short setcol_etc ; YES->色設定
jmp short setcol_end ; NO ->終了
setcol_etc: ;
mov ax,xcol ; その他
mov dispcol,ax ;
setcol_dev: ;
clc ;
ret ;
setcol_end: ;
stc ; キャリーon
ret ;
;----------------------------------------------------------------------------
; int93hファンクション状態表示メッセージ設定
; (ds=csでcall)
; < IN > : ax DISK-BIOS呼出時のAX
; < RET > : dx 表示文字列先頭アドレス
;
; < USE > : ax, si
;----------------------------------------------------------------------------
setmessage: ;
mov ax,rax ; DISK-BIOS呼出時のAX
mov si,OFFSET Memdisktbl ;
setmsg_lp1: ; メモリディスクチェック
cmp al,[si] ;
je short setmsg_disk ;
add si,3 ;
cmp si,OFFSET Memdiskend ;
jne short setmsg_lp1 ;
;
and al,0F0h ; ユニット番号無視
mov si,OFFSET Disktbl ;
setmsg_lp2: ; ディスクチェック
cmp al,[si] ;
je short setmsg_disk ;
add si,3 ;
cmp si,OFFSET Disktblend ;
jne short setmsg_lp2 ;
jmp short setmsg_xx ;
setmsg_disk: ; ディスク処理
mov dx,[si+1] ;
ret ;
setmsg_xx: ; 不明デバイス処理
mov ax,rax ; その他
CONVERT al,sixteen,XXmsg[0] ; AL
mov dx,OFFSET XXmsg ; ??
ret ;
;----------------------------------------------------------------------------
; インターバルタイマ割り込み処理 ; タイマ管理BIOS使用
;----------------------------------------------------------------------------
itimhandr PROC FAR ; 割り込みハンドラ
cli ;
cmp BYTE PTR cs:itimflg,1 ; 処理中 ?
jne short itim_st ; NO->処理開始
sti ;
ret ;
itim_st: ;
mov BYTE PTR cs:itimflg,1 ; 処理中フラグセット
mov ax,cs ;
mov ds,ax ;
mov es,ax ; es=ds=cs
cld ;
cmp BYTE PTR int93flg,1 ; DISK-BIOS処理あり ?
je short itim_dispchk ; YES->表示処理開始
jmp short itim_eracechk ; NO ->消去処理へ
itim_dispchk: ;
call setcolor ; 表示色設定
jc short itim_dispend ;
call setmessage ; 表示メッセージ設定
itim_disp: ;
call int93mon ; ファンクション状態表示
itim_dispend: ;
mov BYTE PTR int93flg,0 ; DISK-BIOS処理フラグクリア
jmp short itim_end ;
itim_eracechk: ;
cmp BYTE PTR dispflg,1 ; 表示中 ?
jne short itim_end ; NO->終了
mov ax,eracetime ;
cmp timecnt,ax ;
jae short itim_erace ; 表示消去時間以上ならば消去
inc WORD PTR timecnt ; カウントアップ
jmp short itim_end ;
itim_erace: ;
call int93erace ; 表示消去
itim_end: ;
mov BYTE PTR cs:itimflg,0 ; 処理中フラグクリア
sti ;
ret ;
itimhandr ENDP ;
;----------------------------------------------------------------------------
; DISK-BIOSの横取り処理
;----------------------------------------------------------------------------
INT93hook PROC FAR ;
mov cs:rax,ax ; DISK-BIOS呼出時のAX保存
INT93H ; DISK-BIOS call
mov BYTE PTR cs:int93flg,1 ; DISK-BIOS処理フラグセット
sti ; 割り込み許可
ret 2 ; フラグをpopせずに,iretをシミュレート
INT93hook ENDP ;
;----------------------------------------------------------------------------
SEGEND LABEL BYTE ; ↑ここまでを常駐
;----------------------------------------------------------------------------
;
;****************************************************************************
; 非常駐処理部
;****************************************************************************
;----------------------------------------------------------------------------
; 文字列表示(^C無効)
; < IN > : ds:si 文字列格納位置
;
; < USE > : si
;----------------------------------------------------------------------------
puts PROC NEAR ;
push dx ;
putslp: ;
mov dl,[si] ;
or dl,dl ; 文字列終端 ?
jz short putsend ; YES->終了
mov ah,02 ;
int 21h ; 文字表示
inc si ;
jmp short putslp ;
putsend: ;
pop dx ;
ret ;
puts ENDP ;
;----------------------------------------------------------------------------
; 表示クリア(ds=csでcall)
;
; < USE > : ax
;----------------------------------------------------------------------------
dispclr: ;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
mov ax,0700h ; 白
ELSE ; ● 高解像度 ●
mov ax,0007h ; 白
ENDIF ;
;///////////////////////////////////////////;
push ax ;
mov ax,OFFSET clrmsg ; 文字列アドレス
push ax ; str
mov ax,_dispy ; 表示位置(行) 0~
push ax ; y
mov ax,_dispx ; 表示位置(桁) 0~
push ax ; x
call TVputs ;
add sp,8 ;
ret ;
;----------------------------------------------------------------------------
; DISK-BIOSベクタ取得(ds=csでcall)
; < RET > : es:bx ベクタアドレス
;----------------------------------------------------------------------------
getvct: ;
mov ax,3593h ;
int 21h ; DISK-BIOS割込みベクタ取得
mov WORD PTR vct93h,bx ;
mov WORD PTR vct93h+2,es ; 本来のDISK-BIOSベクタの取得・保存
ret ;
;----------------------------------------------------------------------------
; 常駐文字列チェック(ds=csでcall)
; < IN > : es 常駐セグメント
; < RET > : ゼロフラグ (等しければ, ゼロフラグon)
;
; < USE > : si, di
;----------------------------------------------------------------------------
tsrcmp: ;
mov cx,TITLE_len ;
mov si,OFFSET TITLE_name ; ds:si
mov di,OFFSET TITLE_name ; es:di
repz cmpsb ; 常駐チェック
ret ;
;----------------------------------------------------------------------------
; 常駐チェック(ds=csでcall)
; < RET > : es:bx 常駐アドレス
;
; < USE > : ax, si, di
;----------------------------------------------------------------------------
tsr_chk: ;
mov BYTE PTR tsrflg,0 ; 常駐フラグクリア
mov BYTE PTR hookflg,0 ; ベクタフックフラグクリア
mcb_chk: ;
mov ah,52h ; 内部変数領域アドレス取得
int 21h ;
mov es,es:[bx-2] ; 先頭MCBセグメントアドレス
mcb_lp: ;
cmp BYTE PTR es:[0],'Z' ; 最終MCB ?
je short mcb_end ; YES->終了
cmp BYTE PTR es:[0],'M' ; MCB ?
jne short mcb_err ; NO ->MCB MARK ERROR
mcb_idchk: ;
push es ; MCBセグメント退避
mov es,WORD PTR es:[1] ; PSPセグメント(Owner ID)
mov ax,es ;
cmp ax,pspseg ; 起動プログラムのPSPか ?
je short mcb_next ; YES->次のMCBをチェック
call tsrcmp ; 常駐文字列照合
jz short mcb_on ; 等しければ, 常駐済
mcb_next: ;
pop es ; MCBセグメント復元
mov ax,es ;
add ax,es:[3] ; 使用メモリのパラグラフ数加算
inc ax ; 次のMCBセグメント
mov es,ax ;
jmp short mcb_lp ;
mcb_on: ; 常駐済
pop ax ; スタック調整
mov BYTE PTR tsrflg,1 ;
mcb_end: ; 非常駐
push bx ;
push es ;
call getvct ; DISK-BIOS割込みベクタ取得
pop es ;
pop bx ;
vctchk_00: ;
mov ax,es ;
cmp WORD PTR vct93h+2,ax ; 常駐セグメント比較
je short vctchk_99 ;
mov BYTE PTR hookflg,1 ; ベクタフックされている
vctchk_99: ;
ret ;
mcb_err: ;
mov si,OFFSET msg6 ; MCBエラー
call puts ;
ret ;
;----------------------------------------------------------------------------
; インターバルタイマの登録(ds=cs)
; < RET > : ax タイマ管理BIOSの返り値
;----------------------------------------------------------------------------
itim_setup: ;
push di ;
mov WORD PTR [parablock+4],cs
mov di,OFFSET parablock ;
xor ax,ax ;
int INT_TIME ;
mov itimerno,al ; タイマ管理番号
pop di ;
ret ;
;----------------------------------------------------------------------------
; インターバルタイマの取消
; < IN > : es 常駐セグメント
; < RET > : ax タイマ管理BIOSの返り値
;----------------------------------------------------------------------------
itim_release: ;
mov ah,01h ;
mov al,es:itimerno ; 常駐部分のタイマ番号
int INT_TIME ;
ret ;
;----------------------------------------------------------------------------
; プログラム名の設定(es=ds=csでcall)
; 常駐時の識別用として, コマンドライン領域にプログラム名を複写しておく.
;----------------------------------------------------------------------------
setpname: ;
mov si,OFFSET prgname ;
mov di,OFFSET ARGUMENT ;
mov cx,prgnamelen ;
rep movsb ; ds:si->es:di
ret ;
;----------------------------------------------------------------------------
; 起動処理( メイン )
;----------------------------------------------------------------------------
main PROC NEAR ;
mov WORD PTR pspseg,es ; PSPセグメント保存
;
; COMファイルとするのでコメントとする.
; mov ax,cs ;
; mov ds,ax ;
; mov es,ax ;
; mov ss,ax ; ss=es=ds=cs
cli ; 割り込み禁止
cld ;
;
mov si,OFFSET msg0 ; オープニングメッセージ(文字列)
call puts ;
call tsr_chk ; 常駐チェック
cmp BYTE PTR tsrflg,0 ; 常駐していない ?
jz short arg_chk ; YES->arg_chk
;
push ds ; 常駐領域内パラメタを複写
push es ;
mov ax,es ;
push ds ;
pop es ;
mov ds,ax ; ds<->es
mov si,OFFSET paraoff ;
mov di,OFFSET paraoff ;
mov cx,parasize ; パラメタ領域サイズ(アップデート用)
rep movsb ; ds:si->es:di
mov si,OFFSET paraoff ;
mov di,OFFSET _paraoff ;
mov cx,parasize ; パラメタ領域サイズ(保持用)
rep movsb ; ds:si->es:di
pop es ;
pop ds ;
arg_chk: ;
sti ;
call argchk ; 引数のチェック
mov al,argflg ;
or al,al ; al=0 ?
jz short tsr_init ; YES->通常処理開始へ
mov si,OFFSET usage ; ヘルプメッセージ
call puts ;
PRGEND ;
tsr_init: ;
mov al,tsrflg ;
or al,al ;
jz short mem_noclr ; 終了
;-------------------------------------------;
; 常駐解除処理
;-------------------------------------------;
mem_clear: ;
mov al,relflg ; 常駐解除フラグ
or al,al ; 常駐解除しない ?
jz short mem_update ; YES->終了
mem_clrchk: ;
cmp BYTE PTR hookflg,0 ; ベクタフックされていないか ?
je short mem_clear_ok ; YES->常駐解除
mov si,OFFSET msg8 ; 常駐解除不可メッセージ
call puts ;
PRGEND ;
mem_clear_ok: ;
push ds ;
lds dx,DWORD PTR es:vct93h ;
mov ax,2593h ; DISK-BIOSを元のベクタに!
int 21h ;
call itim_release ; インターバルタイマの解除
;
; 常駐時に開放するようにしたので, コメントとする.
; push es ;
; mov si,OFFSET ENVADRS ; 環境変数領域を開放
; mov ax,es:[si] ;
; mov es,ax ;
; mov ah,49h ;
; int 21h ;
; pop es ;
;
mov ah,49h ; プログラムを開放
int 21h ;
pop ds ;
jc short mem_clrerr ; メモリ開放失敗
mov si,OFFSET msg2 ; 開放メッセージ
jmp short mem_clrend ;
mem_clrerr: ;
mov si,OFFSET msg7 ; メモリ開放失敗メッセージ
mem_clrend: ;
call puts ;
call dispclr ; 表示クリア
PRGEND ;
;
mem_update: ; 常駐領域内のパラメタ値変更
mov si,OFFSET msg3 ; 常駐済メッセージ
call puts ;
mov al,optflg ;
or al,al ; オプション指定なし ?
jz short mem_upend ; YES->終了
cli ;
call dispclr ; 表示クリア
mov si,OFFSET paraoff ;
mov di,OFFSET paraoff ;
mov cx,parasize ; パラメタ領域サイズ
rep movsb ; ds:si->es:di
sti ;
mov si,OFFSET msg5 ; アップデートメッセージ(文字数)
call puts ;
mem_upend: ;
PRGEND ;
;
mem_noclr: ;
mov al,relflg ; 常駐解除フラグ
or al,al ;
jz short mem_setup ;
mov si,OFFSET msg4 ; 非常駐メッセージ
call puts ;
PRGEND ;
;-------------------------------------------;
; 常駐処理
;-------------------------------------------;
mem_setup: ;
push cs ;
pop es ; es=cs
call setpname ;
mov si,OFFSET msg1 ; 常駐メッセージ
call puts ;
;
call itim_setup ; インターバルタイマ設定
mov dx,OFFSET INT93hook ; 常駐処理プロシジャを
mov ax,2593h ; ベクタセット
int 21h ; (DISK-BIOS)
;
TSREND ; 常駐終了
;----------------------------------------------------------------------------
; 引数のチェック
;----------------------------------------------------------------------------
argchk: ; 引数のチェック
mov bx,OFFSET ARGUMENT ;
mov BYTE PTR optflg,0 ;
arglp: ;
inc bx ;
mov al,[bx] ;
cmp al,0DH ;
jne short optchk ;
ret ; 引数チェック終了
optchk: ; 引数チェック開始
cmp al,'-' ; オプションスイッチは'-','/'で始まる.
je short optsw1 ;
cmp al,'/' ;
je short optsw1 ;
cmp al,' ' ; SPACE
je short arglp ;
cmp al,9H ; TAB
je short arglp ;
jmp opterr ;
optsw1: ;
inc bx ;
mov al,[bx] ;
or al,20H ; 大文字->小文字
cmp al,'r' ; 'r','R'か ?
jne short optsw2 ; NO->次のチェックへ
mov BYTE PTR relflg,1 ; 常駐解除フラグ ON
jmp short arglp ;
optsw2: ; R/W以外のファンクション表示
cmp al,'f' ; 'f'か ?
jne short optsw3 ; NO->次のチェックへ
call atoi ;
cmp BYTE PTR valflg,0 ; 数値指定あり ?
jne short optsw2chk ; YES->数値チェックへ
mov BYTE PTR funcflg,0 ; 表示フラグ標準値設定
jmp short optswon ;
optsw2chk: ;
cmp ax,0 ;
jb short opterr_00 ; 0よりも小さければエラー
cmp ax,1 ;
ja short opterr_00 ; 1よりも大きければエラー
mov funcflg,al ; 表示フラグ格納
jmp short optswon ;
optsw3: ; 反転表示
cmp al,'v' ; 'v'か ?
jne short optsw4 ; NO->次のチェックへ
call atoi ;
cmp BYTE PTR valflg,0 ; 数値指定あり ?
jne short optsw3chk ; YES->数値チェックへ
mov WORD PTR revflg,0800h ; 反転表示フラグ標準値設定
jmp short optswon ;
optsw3chk: ;
or ax,ax ;
jnz short optsw3chk2 ; 0以外は次のチェックへ
mov revflg,ax ;
jmp short optswon ;
optsw3chk2: ;
cmp ax,1 ;
jne short opterr_00 ; 1でなければエラー
mov WORD PTR revflg,0800h ; 反転表示フラグ格納
jmp short optswon ;
optsw4: ; 表示位置(桁)
cmp al,'x' ; 'x'か ?
jne short optsw5 ; NO->次のチェックへ
call atoi ;
cmp BYTE PTR valflg,0 ; 数値指定あり ?
jne short optsw4chk ; YES->数値チェックへ
mov WORD PTR dispx,68 ; 表示位置(桁)標準値設定
jmp short optswon ;
optsw4chk: ;
cmp ax,1 ;
jb short opterr ; 1よりも小さければエラー
cmp ax,80 ;
ja short opterr ; 80よりも大きければエラー
dec ax ; xは0~79
mov dispx,ax ; 表示位置(桁)格納
jmp short optswon ;
opterr_00: ; 中継
jmp short opterr ; エラーへ
arglp_00: ; 中継
jmp arglp ; 次の引数処理へ
optpause: ;
mov al,[bx+1] ;
cmp al,' ' ; SPACE
je short arglp_00 ;
cmp al,9H ; TAB
je short arglp_00 ;
cmp al,0DH ; 終了
je short arglp_00 ;
jmp optsw1 ;
optswon: ;
mov BYTE PTR optflg,1 ; オプションスイッチ ON
jmp short optpause ;
optsw5: ; 表示位置(行)
cmp al,'y' ; 'y'か ?
jne short optsw6 ; NO->次のチェックへ
call atoi ;
cmp BYTE PTR valflg,0 ; 数値指定なし ?
jne short optsw5chk ; NO->数値チェックへ
mov WORD PTR dispy,24 ; 表示位置(行)標準値設定
jmp short optswon ;
optsw5chk: ;
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
cmp ax,1 ;
jb short opterr ; 1よりも小さければエラー
cmp ax,25 ;
ja short opterr ; 25よりも大きければエラー
dec ax ; yは0~24
mov dispy,ax ; 表示位置(行)格納
ELSE ; ● 高解像度 ●
cmp ax,1 ;
jb short opterr ; 1よりも小さければエラー
cmp ax,30 ;
ja short opterr ; 30よりも大きければエラー
dec ax ; yは0~29
mov dispy,ax ; 表示位置(行)格納
ENDIF ;
;///////////////////////////////////////////;
jmp short optswon ;
optsw6: ; 表示消去時間
cmp al,'t' ; 't'か ?
jne short opterr ; NO->次のチェックへ
call atoi ;
cmp BYTE PTR valflg,0 ; 数値指定あり ?
jne short optsw6chk ; YES->数値チェックへ
mov WORD PTR eracetime,50 ; 表示消去時間標準値設定
jmp short optswon ;
optsw6chk: ;
cmp ax,10 ;
jb short opterr ; 10よりも小さければエラー
cmp ax,100 ;
ja short opterr ; 100よりも大きければエラー
mov eracetime,ax ; 表示消去時間格納
jmp short optswon ;
opterr: ; オプションスイッチエラー
mov BYTE PTR argflg,1 ;
ret ;
;----------------------------------------------------------------------------
; 文字列を整数に変換
; < IN > : ds:bx 文字列の先頭位置-1
; < RET > : ax 整数値
;
; < USE > : bx, cx, dx
;----------------------------------------------------------------------------
atoi: ;
inc bx ;
xor ax,ax ; ax=0
xor dx,dx ; dx=0
xor ch,ch ; ch=0
mov BYTE PTR valflg,0 ;
atoi_next: ;
mov cl,[bx] ; 文字コード取得
sub cl,'0' ; 文字->数字
jb short atoi_end ; '0'よりも小さければ終わり
cmp cl,9 ; '9'よりも大きいか ?
ja short atoi_end ; YESならば終わり
push cx ;
mov cx,0AH ;
imul cx ; AXを10倍する
pop cx ;
add ax,cx ; AXに新値を格納
inc bx ; 次の文字位置
mov BYTE PTR valflg,1 ;
jmp short atoi_next ;
atoi_end: ;
dec bx ; 先読み分を戻す
ret ;
;
main ENDP ;
;-------------------------------------------; 起動前の値を保持する領域
_paraoff LABEL BYTE ;
_dispx DW 0 ; 表示位置(桁) 0~
_dispy DW 24 ; 表示位置(行) 0~
_funcflg DB 0 ; R/W以外のファンクション表示フラグ
_revflg DW 0800h ; 反転表示
_eracetime DW 50 ; 表示消去時間(10ms単位)
;-------------------------------------------;
tsrflg DB 0 ; 常駐フラグ
argflg DB 0 ; 引数チェックフラグ
optflg DB 0 ; オプションフラグ
valflg DB 0 ; オプション数値フラグ
relflg DB 0 ; 常駐解除フラグ
hookflg DB 0 ; ベクタフックフラグ
;
pspseg DW ? ; PSPセグメント
prgname DB 12,'ACLAMP v1.01',0Dh ;
prgnamelen EQU $-prgname ;
;
msg0 DB CR,LF,'Access Lamp Version 1.01'
DB ' (C)パオパオ 1990-1993. '
DB CR,LF,0
msg1 DB '★ 常駐します ★',CR,LF,0
msg2 DB '☆ 常駐解除しました ☆',CR,LF,0
msg3 DB '常駐しています.',CR,LF,0
msg4 DB '常駐していません.',CR,LF,BEL,0
msg5 DB 'オプションパラメタ値を更新しました.',CR,LF,BEL,0
msg6 DB 'メモリの状態が正しくありません.',CR,LF,BEL,0
msg7 DB 'メモリの開放に失敗しました.',CR,LF,BEL,0
msg8 DB 'ベクタをフックされているため, 常駐解除できません.'
DB CR,LF,BEL,0
;
clrmsg DB ' ',0
;
usage DB "Usage: 'ACLAMP "
DB "[-r] [-f[n]] [-v[n]] [-x[n]] [-y[n]] [-t[n]]'"
DB CR,LF
DB ' -r 常駐解除 ',CR,LF
DB ' -f[n] R/W以外も表示 '
DB 'n: 0=しない, 1=する, 標準: 0',CR,LF
DB ' -v[n] 反転表示 '
DB 'n: 0=しない, 1=する, 標準: 1',CR,LF
DB ' -x[n] 表示桁位置 '
DB 'n: 1~80, 標準: 69',CR,LF
DB ' -y[n] 表示行位置 '
;///////////////////////////////////////////;
IFNDEF HIGH_RESO ; ● 中解像度 ●
DB 'n: 1~25, 標準: 25(最下行)',CR,LF
ELSE ; ● 高解像度 ●
DB 'n: 1~30, 標準: 25(最下行)',CR,LF
ENDIF ;
;///////////////////////////////////////////;
DB ' -t[n] 表示消去時間 '
DB 'n: 10~100 (単位10ms), 標準: 50(0.5秒)',CR,LF
DB 0
;
code ENDS ;
END entry ;
;
;============================================================================
; アトリビュート
;
; Middle Resolution Display Type
;
; 7 6 5 4 3 2 1 0
; ┌─┬─┬─┬─┬─┬─┬─┬─┐
; └─┴─┴─┴─┴─┴─┴─┴─┘
; 0 ↓ I BLK REV G R B
; KANJI
; .........................................................................
;
; High Resolution Display Type
;
; 7 6 5 4 3 2 1 0
; ┌─┬─┬─┬─┬─┬─┬─┬─┐
; └─┴─┴─┴─┴─┴─┴─┴─┘
; 0 0 0 0 I G R B
;
; 15 14 13 12 11 10 9 8
; ┌─┬─┬─┬─┬─┬─┬─┬─┐
; └─┴─┴─┴─┴─┴─┴─┴─┘
; 0 SCT UNS BLK REV VTL OVL UNL
; .........................................................................
;
; G R B G R B G R B G R B
; 黒 0 0 0 青 0 0 1 赤 0 1 0 紫 0 1 1
; 緑 1 0 0 水 1 0 1 黄 1 1 0 白 1 1 1
;============================================================================
;
; < HISTORY >
;============================================================================
; 1990.05.20 : CREATE
; 1990.06.02 : V0.70 ROM,RAM にも対応。
; 1990.06.03 : V0.71 細かい修正 etc.
; 1991.08.31 : V0.72 メッセージ出力をDOSファンクション使用に変更.
; 1992.10.23 : FMRのテキストVRAM直書に変更. (FMR50/FMR70用に別々アセンブルする)
; 1992.11.01 : ディスクBIOSに対する影響を最小限にするため, インターバルタイマ割り込み
; で表示/消去をするようにした.
; 1992.11.15 : MCBチェックにより, 再常駐しないようにした.
; 1993.03.02 : 常駐時にデフォルトオープンファイルをクローズするようにした.
;============================================================================